home *** CD-ROM | disk | FTP | other *** search
- {
- LOU DUCHEZ
-
- >I have two questions. First, How can I display ANSI files from a Pascal
- >program by using the CON driver (read: ANSI.SYS) instead of going to the
- >trouble of writing a terminal emulator, and still remain
- >window-relative? I used TP5.5's WRITE procedure to write to a file
- >assigned to the CON device instead of the CRT unit's standard OutPut,
- >but this obliterated my status line at the bottom of the screen when the
- >ANSI file scrolled. Is there an easy way to write to the CON device
- >while remaining window-relative without having to modify ANSI.SYS or
- >write a terminal emulation procedure?
- > My second question: How can I call a batch file from within a Pascal
- >program and pass %1-%9 parameters to it? I'm aware of the EXEC
- >procedure, but doesn't that only work on executables?
-
- Second question first: you're right about EXEC calling only executables.
- So try calling "COMMAND.COM" as your program, and give it parameters of
- "/C " plus the batch file name plus whatever arguments you intend to pass.
- (That tells the system to run a single command out of DOS.) Look up
- ParamCount and ParamStr() to see how Pascal uses command-line parameters.
-
- First question second: you know, I addressed this problem just yesterday
- trying to write a program. I concluded that, if you're going to bypass
- CRT, you need to do a lot of "manual" work yourself to keep a window
- going. Let me show you the tools I devised:
-
-
- ---PROCEDURE ATSCROLL: SCROLLS A SCREEN REGION UP OR DOWN (negative or
- positive number in LINESDOWN, respectively)
- }
-
- procedure atscroll(x1, y1, x2, y2 : byte; linesdown : integer);
- var
- tmpbyte,
- intbyte,
- clearattrib : byte;
- begin
- if linesdown <> 0 then
- begin
- clearattrib := foxfore + foxback shl 4;
- x1 := x1 - 1;
- y1 := y1 - 1;
- x2 := x2 - 1;
- y2 := y2 - 1;
- if linesdown > 0 then
- intbyte := $07
- else
- intbyte := $06;
- tmpbyte := abs(linesdown);
- asm
- mov ah, intbyte
- mov al, tmpbyte
- mov bh, clearattrib
- mov ch, y1
- mov cl, x1
- mov dh, y2
- mov dl, x2
- int 10h
- end;
- end;
- end;
-
- {
- ---FUNCTION YPOS: Returns the line the cursor is on. I wrote it because
- I don't always trust WHEREY (or WHEREX): they report, for example, the
- cursor position relative to a text window. So I had it lying around,
- and I opted to use it in my routines.
- }
- function ypos : byte;
- var
- tmpbyt : byte;
- begin
- asm
- mov ah, 03h
- mov bh, 0
- int 10h
- mov tmpbyt, dh
- end;
- ypos := tmpbyt + 1;
- end;
-
- {
- --- PROCEDURE WRITEANDFIXOVERHANG: I use it in place of WRITELN in my
- program: before writing a line of text, it checks if there's room
- at the bottom of the screen. If not, it scrolls the screen up
- before writing. Keep in mind that this program is bent on preserving
- the top three or four screen lines, not the bottom lines.
- }
- procedure writeandfixoverhang(strin : string);
- const
- scrollat : byte = 24;
- var
- overhang : byte;
- begin
- if ypos >= scrollat then
- begin
- overhang := ypos - scrollat + 1;
- atscroll(0, 4 + overhang, 0, 80, 25, -overhang);
- movecursor(1, ypos - overhang);
- end;
- writeln(strin);
- end;
-
- {
- So assuming your text lines don't get too long (line longer than 160 chars),
- these routines will keep the top of your screen from getting eaten. If you
- want to preserve space at the bottom of the screen instead (or both top and
- bottom), change WRITEANDFIXOVERHANG.
-
- BTW, if there are any compiling problems, let me know. I took out all the
- stuff that applied specifically to my application -- I might have stupidly
- changed something you need ...
- }